<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  
  
  <title>Hexo</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="第十三章MySQL01 数据库概念 数据库的基本概念   数据库的英文单词： DataBase 简称 ： DB    什么数据库？  用于存储和管理数据的仓库。      数据库的特点：   持久化存储数据的。其实数据库就是一个文件系统    方便存储和管理数据    使用了统一的方式操作数据库 — SQL    常见的数据库软件   参见《MySQL基础.pdf》              02">
<meta property="og:type" content="article">
<meta property="og:title" content="Hexo">
<meta property="og:url" content="https://goofyer.gitee.io/notes-on-computer-expertise/2021/12/20/Java/%E7%AC%AC%E5%8D%81%E4%B8%89%E7%AB%A0MySQL/index.html">
<meta property="og:site_name" content="Hexo">
<meta property="og:description" content="第十三章MySQL01 数据库概念 数据库的基本概念   数据库的英文单词： DataBase 简称 ： DB    什么数据库？  用于存储和管理数据的仓库。      数据库的特点：   持久化存储数据的。其实数据库就是一个文件系统    方便存储和管理数据    使用了统一的方式操作数据库 — SQL    常见的数据库软件   参见《MySQL基础.pdf》              02">
<meta property="og:locale" content="en_US">
<meta property="article:published_time" content="2021-12-19T17:33:22.655Z">
<meta property="article:modified_time" content="2021-12-19T17:33:23.328Z">
<meta property="article:author" content="John Doe">
<meta name="twitter:card" content="summary">
  
    <link rel="alternate" href="/notes-on-computer-expertise/atom.xml" title="Hexo" type="application/atom+xml">
  
  
    <link rel="shortcut icon" href="/notes-on-computer-expertise/favicon.png">
  
  
    
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/typeface-source-code-pro@0.0.71/index.min.css">

  
  
<link rel="stylesheet" href="/notes-on-computer-expertise/css/style.css">

  
    
<link rel="stylesheet" href="/notes-on-computer-expertise/fancybox/jquery.fancybox.min.css">

  
<meta name="generator" content="Hexo 5.4.0"></head>

<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
  <div id="banner"></div>
  <div id="header-outer" class="outer">
    <div id="header-title" class="inner">
      <h1 id="logo-wrap">
        <a href="/notes-on-computer-expertise/" id="logo">Hexo</a>
      </h1>
      
    </div>
    <div id="header-inner" class="inner">
      <nav id="main-nav">
        <a id="main-nav-toggle" class="nav-icon"></a>
        
          <a class="main-nav-link" href="/notes-on-computer-expertise/">Home</a>
        
          <a class="main-nav-link" href="/notes-on-computer-expertise/archives">Archives</a>
        
      </nav>
      <nav id="sub-nav">
        
          <a id="nav-rss-link" class="nav-icon" href="/notes-on-computer-expertise/atom.xml" title="RSS Feed"></a>
        
        <a id="nav-search-btn" class="nav-icon" title="Search"></a>
      </nav>
      <div id="search-form-wrap">
        <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="https://goofyer.gitee.io/notes-on-computer-expertise"></form>
      </div>
    </div>
  </div>
</header>

      <div class="outer">
        <section id="main"><article id="post-Java/第十三章MySQL" class="h-entry article article-type-post" itemprop="blogPost" itemscope itemtype="https://schema.org/BlogPosting">
  <div class="article-meta">
    <a href="/notes-on-computer-expertise/2021/12/20/Java/%E7%AC%AC%E5%8D%81%E4%B8%89%E7%AB%A0MySQL/" class="article-date">
  <time class="dt-published" datetime="2021-12-19T17:33:22.655Z" itemprop="datePublished">2021-12-20</time>
</a>
    
  </div>
  <div class="article-inner">
    
    
    <div class="e-content article-entry" itemprop="articleBody">
      
        <h2 id="第十三章MySQL"><a href="#第十三章MySQL" class="headerlink" title="第十三章MySQL"></a>第十三章MySQL</h2><h3 id="01-数据库概念"><a href="#01-数据库概念" class="headerlink" title="01 数据库概念"></a>01 数据库概念</h3><ul>
<li><p>数据库的基本概念</p>
<ul>
<li><ol>
<li>数据库的英文单词： DataBase 简称 ： DB</li>
</ol>
</li>
<li><ol>
<li><p>什么数据库？</p>
<ul>
<li>用于存储和管理数据的仓库。</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>数据库的特点：</p>
<ul>
<li><ol>
<li>持久化存储数据的。其实数据库就是一个文件系统</li>
</ol>
</li>
<li><ol>
<li>方便存储和管理数据</li>
</ol>
</li>
<li><ol>
<li>使用了统一的方式操作数据库 — SQL</li>
</ol>
</li>
<li><ol>
<li><p>常见的数据库软件</p>
<ul>
<li><ul>
<li>参见《MySQL基础.pdf》</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
<h3 id="02-MySQL安装与使用"><a href="#02-MySQL安装与使用" class="headerlink" title="02 MySQL安装与使用"></a>02 MySQL安装与使用</h3><ul>
<li><p>MySQL数据库软件</p>
<ul>
<li><ol>
<li><p>安装</p>
<ul>
<li><ul>
<li>参见《MySQL基础.pdf》</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>卸载</p>
<ul>
<li><ol>
<li><p>去mysql的安装目录找到my.ini文件</p>
<ul>
<li><ul>
<li>复制 datadir=”C:/ProgramData/MySQL/MySQL Server 5.5/Data/“</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li>卸载MySQL</li>
</ol>
</li>
<li><ol>
<li>删除C:/ProgramData目录下的MySQL文件夹。</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>配置</p>
<ul>
<li><p>①* MySQL服务启动</p>
<ul>
<li><ol>
<li>手动。</li>
</ol>
</li>
<li><ol>
<li>cmd—&gt; services.msc 打开服务的窗口</li>
</ol>
</li>
<li><ol>
<li><p>使用管理员打开cmd</p>
<ul>
<li><ul>
<li>net start mysql : 启动mysql的服务</li>
</ul>
</li>
<li><ul>
<li>net stop mysql:关闭mysql服务</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li><p>②* MySQL登录</p>
<ul>
<li><ol>
<li>mysql -uroot -p密码</li>
</ol>
</li>
<li><ol>
<li>mysql -hip -uroot -p连接目标的密码</li>
</ol>
</li>
<li><ol>
<li>mysql —host=ip —user=root —password=连接目标的密码</li>
</ol>
</li>
</ul>
</li>
<li><p>③* MySQL退出</p>
<ul>
<li><ol>
<li>exit</li>
</ol>
</li>
<li><ol>
<li>quit</li>
</ol>
</li>
</ul>
</li>
<li><p>④* MySQL目录结构</p>
<ul>
<li><ol>
<li><p>MySQL安装目录：basedir=”D:/develop/MySQL/“</p>
<ul>
<li><ul>
<li>配置文件 my.ini</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li><ol>
<li><p>MySQL数据目录：datadir=”C:/ProgramData/MySQL/MySQL Server 5.5/Data/“</p>
<ul>
<li><ul>
<li>几个概念</li>
</ul>
</li>
<li><ul>
<li>数据库：文件夹</li>
</ul>
</li>
<li><ul>
<li>表：文件</li>
</ul>
</li>
<li><ul>
<li>数据：数据</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><p>MySQL安装目录</p>
<ul>
<li>bin目录：存放二进制的可执行文件（mysql.exe：登录MySQL服务器的命令）。</li>
<li>data目录：数据目录，存放MySQL的数据文件、日志文件。</li>
<li>include目录：C语言的头信息。</li>
<li>lib目录：MySQL需要的一些jar包、运行需要的库文件。</li>
<li>share目录：存放mysql的一些错误信息。</li>
<li>my.ini：mysql的配置文件。</li>
</ul>
</li>
</ul>
<h3 id="03-SQL基本概念与通用语法"><a href="#03-SQL基本概念与通用语法" class="headerlink" title="03 SQL基本概念与通用语法"></a>03 SQL基本概念与通用语法</h3><ul>
<li><p>1.什么是SQL？</p>
<ul>
<li>Structured Query Language：结构化查询语言</li>
<li>其实就是定义了操作所有关系型数据库的规则。每一种数据库操作的方式存在不一样的地方，称为“方言”。</li>
</ul>
</li>
<li><p>2.SQL通用语法</p>
<ul>
<li><ol>
<li>SQL 语句可以单行或多行书写，以分号结尾。</li>
</ol>
</li>
<li><ol>
<li>可使用空格和缩进来增强语句的可读性。</li>
</ol>
</li>
<li><ol>
<li>MySQL 数据库的 SQL 语句不区分大小写，关键字建议使用大写。</li>
</ol>
</li>
<li><ol>
<li><p>3 种注释</p>
<ul>
<li>单行注释: — 注释内容 或 # 注释内容(mysql 特有) </li>
<li>多行注释: /<em> 注释 </em>/</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li><ol>
<li><p>SQL分类</p>
<ul>
<li><p>1) DDL(Data Definition Language)数据定义语言</p>
<ul>
<li>用来定义数据库对象：数据库，表，列等。关键字：create, drop,alter 等</li>
</ul>
</li>
<li><p>2) DML(Data Manipulation Language)数据操作语言</p>
<ul>
<li>用来对数据库中表的数据进行增删改。关键字：insert, delete, update 等</li>
</ul>
</li>
<li><p>3) DQL(Data Query Language)数据查询语言</p>
<ul>
<li>用来查询数据库中表的记录(数据)。关键字：select, where 等</li>
</ul>
</li>
<li><p>4) DCL(Data Control Language)数据控制语言(了解)</p>
<ul>
<li>用来定义数据库的访问权限和安全级别，及创建用户。关键字：GRANT， REVOKE 等</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><p>SQL通用语法</p>
</li>
</ul>
<h3 id="04-数据库的CRUD操作"><a href="#04-数据库的CRUD操作" class="headerlink" title="04 数据库的CRUD操作"></a>04 数据库的CRUD操作</h3><ul>
<li><p>SQL分类</p>
<ul>
<li><p>DDL_操作数据库_创建&amp;查询</p>
<ul>
<li>1) DDL(Data Definition Language)数据定义语言：用来定义数据库对象：数据库，表，列等。关键字：create, drop,alter 等。</li>
<li>2) DML(Data Manipulation Language)数据操作语言：用来对数据库中表的数据进行增删改。关键字：insert, delete, update 等。</li>
<li>3) DQL(Data Query Language)数据查询语言：用来查询数据库中表的记录(数据)。关键字：select, where 等。</li>
<li>4) DCL(Data Control Language)数据控制语言(了解)：用来定义数据库的访问权限和安全级别，及创建用户。关键字：GRANT， REVOKE 等。</li>
</ul>
</li>
<li><ol>
<li><p>操作数据库：CRUD</p>
<ul>
<li><ol>
<li><p>C(Create)：创建</p>
<ul>
<li><ul>
<li>创建数据库：create database 数据库名称;</li>
</ul>
</li>
<li><ul>
<li>创建数据库，判断不存在，再创建：create database if not exists 数据库名称;</li>
</ul>
</li>
<li><ul>
<li>创建数据库，并指定字符集：create database 数据库名称 character set 字符集名;</li>
</ul>
</li>
<li><ul>
<li>练习： 创建db4数据库，判断是否存在，并制定字符集为gbk：create database if not exists db4 character set gbk;</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>R(Retrieve)：查询</p>
<ul>
<li><ul>
<li>查询所有数据库的名称：show databases;</li>
</ul>
</li>
<li><ul>
<li>查询某个数据库的字符集（查询某个数据库的创建语句）：show create database 数据库名称;</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>U(Update)：修改</p>
<ul>
<li><ul>
<li>修改数据库的字符集：alter database 数据库名称 character set 字符集名称;</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>D(Delete)：删除</p>
<ul>
<li><ul>
<li>删除数据库：drop database 数据库名称;</li>
</ul>
</li>
<li><ul>
<li>判断数据库存在，存在再删除：drop database if exists 数据库名称;</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>使用数据库</p>
<ul>
<li><ul>
<li>查询当前正在使用的数据库名称：select database();</li>
</ul>
</li>
<li><ul>
<li>使用数据库：use 数据库名称;</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><p>information_schema：描述MySQL数据库信息（有哪些表、有哪些库的名字）。此库中的数据库、数据表，并不是真正的数据库、数据表（视图），并不存在真正的目的文件。</p>
</li>
<li>mysql：MySQL核心数据库，存放着很多的核心数据。</li>
<li>performance_schema：对性能提升做操作的数据库。【information_schema、mysql、performance_schema 这三个数据库，尽量不要碰！】</li>
<li>test：测试数据库，空数据库，可以任意使用。</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
<h3 id="05-数据库表的CRUD操作"><a href="#05-数据库表的CRUD操作" class="headerlink" title="05 数据库表的CRUD操作"></a>05 数据库表的CRUD操作</h3><ul>
<li><p>数据字段类型</p>
<ul>
<li>int：整数类型【age int】</li>
<li>double：小数类型【score double(5, 2)  最多5位, 保留2位小数】</li>
<li>date：日期，只包含 年月日，yyyy-MM-dd</li>
<li>datetime：日期，包含年月日时分秒 yyyy-MM-dd HH:mm:ss</li>
<li>timestamp：时间戳类型，包含年月日时分秒，yyyy-MM-dd HH:mm:ss【如果将来不给这个字段赋值，或赋值为null，则默认使用当前的系统时间来自动赋值。】</li>
<li>varchar：字符串【name varchar(20)：姓名最大20个字符；zhangsan 8个字符、张三 2个字符】</li>
</ul>
</li>
<li><p>DDL_操作表_查询</p>
<ul>
<li><p>R(Retrieve)：查询</p>
<ul>
<li>查询某个数据库中所有的表名称：show tables;</li>
<li>查询表结构：desc 表名;（description）</li>
</ul>
</li>
</ul>
</li>
<li><p>表创建</p>
<ul>
<li>create table 表名(<br>列名1 数据类型1,<br>列名2 数据类型2,<br>…<br>列名n 数据类型n<br>);</li>
</ul>
</li>
<li><p>复制表</p>
<ul>
<li>create table 表名 like 被复制的表名;</li>
</ul>
</li>
<li><p>DDL_操作表_修改</p>
<ul>
<li>修改表名：alter table 表名 rename to 新的表名;</li>
<li>修改表的字符集：alter table 表名 character set 字符集名称;</li>
<li>添加一列：alter table 表名 add 列名 数据类型;</li>
<li>修改列名称 类型：alter table 表名 change 列名 新列名 新数据类型;   alter table 表名 modify 列名 新数据类型;</li>
<li>删除列：alter table 表名 drop 列名;</li>
<li>修改表名：alter table 表名 rename to 新的表名;</li>
</ul>
</li>
<li><p>DDL_操作表_删除</p>
<ul>
<li>drop table 表名;</li>
<li>drop table  if exists 表名 ;</li>
</ul>
</li>
<li><p>例子</p>
<ul>
<li><p>创建表</p>
<ul>
<li>create table student(<br>id int,<br>name varchar(32),<br>age int,<br>score double(4,1),<br>birthday date,<br>insert_time timestamp<br>);</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="06-数据库表中记录的基本操作"><a href="#06-数据库表中记录的基本操作" class="headerlink" title="06 数据库表中记录的基本操作"></a>06 数据库表中记录的基本操作</h3><ul>
<li><p>DML_添加数据</p>
<ul>
<li>语法：insert into 表名(列名1,列名2,…列名n) values(值1,值2,…值n);</li>
<li><p>注意：</p>
<ul>
<li>列名和值要一一对应。</li>
<li>如果表名后，不定义列名，则默认给所有列添加值【insert into 表名 values(值1,值2,…值n);】</li>
<li>除了数字类型，其他类型需要使用引号(单双都可以)引起来。</li>
</ul>
</li>
</ul>
</li>
<li><p>DML_删除数据</p>
<ul>
<li>语法：delete from 表名 [where 条件]</li>
<li><p>注意：</p>
<ul>
<li>如果不加条件，则删除表中所有记录。</li>
<li>如果要删除所有记录</li>
<li>delete from 表名; — 不推荐使用。有多少条记录就会执行多少次删除操作（效率低）。</li>
<li>TRUNCATE TABLE 表名; —（推荐使用，效率更高）先删除表，然后再创建一张一样的表。</li>
</ul>
</li>
</ul>
</li>
<li><p>DML_修改数据</p>
<ul>
<li>语法：update 表名 set 列名1 = 值1, 列名2 = 值2,… [where 条件];</li>
<li>注意：如果不加任何条件，则会将表中所有记录全部修改。</li>
</ul>
</li>
<li><p>数据库 终端 操作 报错</p>
<ul>
<li><p>报错的命令：ERROR 1366 (HY000): Incorrect string value: ‘\xC3\xFB\xD7\xD6’ for column ‘n</p>
<ul>
<li>解决方法（原文链接）：<a target="_blank" rel="noopener" href="https://blog.csdn.net/u013317172/article/details/82778785">https://blog.csdn.net/u013317172/article/details/82778785</a></li>
</ul>
</li>
<li><p>ERROR 1366 (HY000): Incorrect string value: ‘\xD5\xC5\xD0\xA1\xC3\xF7’ for column ‘NAME’ at row 1</p>
<ul>
<li><p>解决方案：</p>
<ul>
<li>1.先找到Mysql数据库安装路径，如下图：</li>
<li>2.找到这个文件夹里面的 my.ini 文件，在里面找到 “default-character-set=utf8”，把uft8修改成gbk。</li>
<li>重新登陆到mysql数据库就可以添加中文数据了。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="07-数据库的查询操作"><a href="#07-数据库的查询操作" class="headerlink" title="07 数据库的查询操作"></a>07 数据库的查询操作</h3><ul>
<li>— 查询年龄大于20岁<br>SELECT <ul>
<li>FROM<br>student<br>WHERE age &gt; 20 ;<br>SELECT * FROM student WHERE age &gt;= 20;</li>
</ul>
</li>
</ul>
<p>— 查询年龄等于20岁<br>SELECT * FROM student WHERE age = 20;</p>
<p>— 查询年龄不等于20岁<br>SELECT <em> FROM student WHERE age != 20;<br>SELECT </em> FROM student WHERE age &lt;&gt; 20;</p>
<p>— 查询年龄大于等于20 小于等于30<br>SELECT <em> FROM student WHERE age &gt;= 20 &amp;&amp;  age &lt;=30;<br>SELECT </em> FROM student WHERE age &gt;= 20 AND  age &lt;=30;<br>SELECT * FROM student WHERE age BETWEEN 20 AND 30; — 闭区间[20, 30]</p>
<p>— 查询年龄22岁，18岁，25岁的信息<br>SELECT <em> FROM student WHERE age = 22 OR age = 18 OR age = 25<br>SELECT </em> FROM student WHERE age IN (22,18,25);</p>
<p>— 查询英语成绩为null<br>SELECT * FROM student WHERE english = NULL; — 错误！null值不能使用 = （!=） 判断</p>
<p>SELECT * FROM student WHERE english IS NULL;</p>
<p>— 查询英语成绩不为null<br>SELECT * FROM student WHERE english  IS NOT NULL;<br>DQL_基础查询_模糊查询<br>LIKE：模糊查询</p>
<p>占位符：<br>_：单个任意字符<br>%：多个任意字符<br>— 查询姓马的有哪些？ like<br>SELECT </p>
<ul>
<li>FROM<br>student<br>WHERE NAME LIKE ‘马%’ ;</li>
</ul>
<p>— 查询姓名第二个字是化的人<br>SELECT * FROM student WHERE NAME LIKE “_化%”;</p>
<p>— 查询姓名是3个字的人<br>SELECT * FROM student WHERE NAME LIKE ‘___’;</p>
<p>— 查询姓名中包含德的人<br>SELECT * FROM student WHERE NAME LIKE ‘%德%’;</p>
<ul>
<li><p>DQL_基础查询</p>
<ul>
<li><ol>
<li><p>多个字段的查询</p>
<ul>
<li>select 字段名1，字段名2… from 表名；</li>
<li>注意：如果查询所有字段，则可以使用*来替代字段列表。</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>去除重复：</p>
<ul>
<li>distinct</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>计算列</p>
<ul>
<li>一般可以使用四则运算计算一些列的值（一般只会进行数值型的计算）。</li>
<li>ifnull(表达式1,表达式2)：null参与的运算，计算结果都为null。</li>
<li>表达式1：哪个字段需要判断是否为null</li>
<li>如果该字段为null后的替换值。</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>起别名：</p>
<ul>
<li>as：as可以省略。</li>
</ul>
</li>
</ol>
</li>
<li><p>CREATE TABLE student (<br>id INT,<br>— 编号<br>NAME VARCHAR (20),<br>— 姓名<br>age INT,<br>— 年龄<br>sex VARCHAR (5),<br>— 性别<br>address VARCHAR (100),<br>— 地址<br>math INT,<br>— 数学<br>english INT— 英语<br>) ;</p>
</li>
</ul>
</li>
</ul>
<p>INSERT INTO student(id,NAME,age,sex,address,math,english) VALUES<br>(1,’马云’,55,’男’,’杭州’,66,78),<br>(2,’马化腾’,45,’女’,’深圳’,98,87),<br>(3,’马景涛’,55,’男’,’香港’,56,77),<br>(4,’柳岩’,20,’女’,’湖南’,76,65),<br>(5,’柳青’,20,’男’,’湖南’,86,NULL),<br>(6,’刘德华’,57,’男’,’香港’,99,99),<br>(7,’马德’,22,’女’,’香港’,99,99),<br>(8,’德玛西亚’,18,’男’,’南京’,56,65);</p>
<p>SELECT * FROM student;</p>
<ul>
<li><p>DQL_条件查询</p>
<ul>
<li><ol>
<li>where子句后跟条件</li>
</ol>
</li>
<li><ol>
<li><p>运算符</p>
<ul>
<li><blockquote>
<p>、&lt; 、&lt;= 、&gt;= 、= 、&lt;&gt;</p>
</blockquote>
</li>
<li>BETWEEN…AND  </li>
<li>IN( 集合) </li>
<li>LIKE：模糊查询</li>
<li>占位符：</li>
<li>_：单个任意字符</li>
<li>%：多个任意字符</li>
<li>IS NULL  </li>
<li>and  或 &amp;&amp;</li>
<li>or  或 || </li>
<li>not  或 !</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li><p>DQL_排序查询</p>
<ul>
<li><ol>
<li><p>排序查询</p>
<ul>
<li>语法：order by 子句</li>
<li>order by 排序字段1 排序方式1 ，  排序字段2 排序方式2…</li>
<li><p>排序方式：</p>
<ul>
<li>ASC：升序（默认）。</li>
<li>DESC：降序。</li>
</ul>
</li>
<li><p>注意：</p>
<ul>
<li>如果有多个排序条件，则当前边的条件值一样时，才会判断第二条件。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>聚合函数：将一列数据作为一个整体，进行纵向的计算</p>
<ul>
<li><p>方法</p>
<ul>
<li>count：计算个数</li>
<li><p>一般选择非空的列：主键</p>
<ul>
<li>count(*)</li>
<li>max：计算最大值</li>
<li>min：计算最小值</li>
<li>sum：计算和</li>
<li>avg：计算平均值</li>
</ul>
</li>
</ul>
</li>
<li><p>注意</p>
<ul>
<li>聚合函数的计算，排除null值。</li>
<li><p>解决方案</p>
<ul>
<li>1、选择不包含非空的列进行计算；</li>
<li>2、IFNULL函数。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li><p>DQL_分组查询</p>
<ul>
<li><ol>
<li><p>分组查询：</p>
<ul>
<li><p>语法</p>
<ul>
<li>group by 分组字段；</li>
</ul>
</li>
<li><p>注意</p>
<ul>
<li>分组之后查询的字段：分组字段、聚合函数</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li><p>where 和 having 的区别？</p>
<ul>
<li>where 在分组之前进行限定，如果不满足条件，则不参与分组。having在分组之后进行限定，如果不满足结果，则不会被查询出来</li>
<li>where 后不可以跟聚合函数，having可以进行聚合函数的判断。</li>
</ul>
</li>
<li><p>例子</p>
<ul>
<li><p>— 按照性别分组。分别查询男、女同学的平均分</p>
<ul>
<li>SELECT sex , AVG(math) FROM student GROUP BY sex;</li>
</ul>
</li>
<li><p>— 按照性别分组。分别查询男、女同学的平均分,人数</p>
<ul>
<li>SELECT sex , AVG(math), COUNT(id) FROM student GROUP BY sex;</li>
</ul>
</li>
<li><p>— 按照性别分组。分别查询男、女同学的平均分,人数 要求：分数低于70分的人，不参与分组</p>
<ul>
<li>SELECT sex , AVG(math), COUNT(id) FROM student WHERE math &gt; 70 GROUP BY sex;</li>
</ul>
</li>
<li><p>— 按照性别分组。分别查询男、女同学的平均分,人数 要求：分数低于70分的人，不参与分组,分组之后。人数要大于2个人</p>
<ul>
<li>SELECT sex , AVG(math), COUNT(id) FROM student WHERE math &gt; 70 GROUP BY sex HAVING COUNT(id) &gt; 2;</li>
<li>SELECT sex , AVG(math), COUNT(id) 人数 FROM student WHERE math &gt; 70 GROUP BY sex HAVING 人数 &gt; 2</li>
</ul>
</li>
</ul>
</li>
<li><p>DQL_分页查询</p>
<ul>
<li><ol>
<li><p>分页查询</p>
<ul>
<li><p>语法</p>
<ul>
<li>limit开始的索引,每页查询的条数;</li>
</ul>
</li>
<li><p>公式</p>
<ul>
<li>开始的索引 = （当前的页码 - 1） * 每页显示的条数</li>
<li><p>每页显示3条记录 </p>
<ul>
<li>SELECT * FROM student LIMIT 0,3; — 第1页：从0开始查，查3条记录</li>
<li>SELECT * FROM student LIMIT 3,3; — 第2页：从3开始查，查3条记录</li>
<li>SELECT * FROM student LIMIT 6,3; — 第3页：</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
<h3 id="08-表的约束"><a href="#08-表的约束" class="headerlink" title="08 表的约束"></a>08 表的约束</h3><ul>
<li><p>约束_概述</p>
<ul>
<li>概念：对表中的数据进行限定，保证数据的正确性、有效性和完整性。    </li>
<li><p>分类：</p>
<ul>
<li>1.主键约束：primary key</li>
<li>2.非空约束：not null</li>
<li>3.唯一约束：unique</li>
<li>4.外键约束：foreign key</li>
</ul>
</li>
</ul>
</li>
<li><p>约束_非空约束</p>
<ul>
<li><p>非空约束：not null，值不能为nul</p>
<ul>
<li><ol>
<li><p>创建表时，添加约束</p>
<ul>
<li>CREATE TABLE stu(<br>id INT,<br>NAME VARCHAR(20) NOT NULL — name为非空<br>);</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li>创建表后，再添加非空约束：ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;</li>
</ol>
</li>
<li><ol>
<li>删除name的非空约束：ALTER TABLE stu MODIFY NAME VARCHAR(20);</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
<li><p>约束_唯一约束</p>
<ul>
<li><p>唯一约束：unique，值不能重复。</p>
<ul>
<li><ol>
<li><p>创建表时，添加唯一约束</p>
<ul>
<li>CREATE TABLE stu(</li>
<li>id INT,</li>
<li>phone_number VARCHAR(20) UNIQUE — 添加了唯一约束</li>
<li>);</li>
<li><ul>
<li>注意mysql中，唯一约束限定的列的值可以有多个null。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li>删除唯一约束：ALTER TABLE stu DROP INDEX phone_number;</li>
</ol>
</li>
<li><ol>
<li>在创建表后，添加唯一约束：ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
<li><p>约束_主键约束</p>
<ul>
<li><p>主键约束：primary key</p>
<ul>
<li><ol>
<li><p>注意：</p>
<ul>
<li><ol>
<li>含义：非空且唯一</li>
</ol>
</li>
<li><ol>
<li>一张表只能有一个字段为主键</li>
</ol>
</li>
<li><ol>
<li>主键就是表中记录的唯一标识</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>在创建表时，添加主键约束</p>
<ul>
<li>create table stu(<br>id int primary key,— 给id添加主键约束<br>name varchar(20)<br>);</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>删除主键</p>
<ul>
<li>ALTER TABLE stu DROP PRIMARY KEY;</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>创建完表后，添加主键</p>
<ul>
<li>ALTER TABLE stu MODIFY id INT PRIMARY KEY;</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
<li><p>约束_主键约束_自动增长</p>
<ul>
<li><ol>
<li><p>自动增长：</p>
<ul>
<li><ol>
<li>概念：如果某一列是数值类型的，使用 auto_increment 可以来完成值得自动增长</li>
</ol>
</li>
<li><ol>
<li><p>在创建表时，添加主键约束，并且完成主键自增长</p>
<ul>
<li>create table stu(</li>
<li>id int primary key auto_increment,— 给id添加主键约束</li>
<li>name varchar(20)</li>
<li>);</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li>删除自动增长：ALTER TABLE stu MODIFY id INT;</li>
</ol>
</li>
<li><ol>
<li>添加自动增长：ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li><p>约束_外键约束</p>
<ul>
<li><p>外键约束——缺陷举例</p>
<ul>
<li>CREATE TABLE emp ( — 创建employe表<br>id INT PRIMARY KEY AUTO_INCREMENT,<br>NAME VARCHAR(30),<br>age INT,<br>dep_name VARCHAR(30), — 部门名称<br>dep_location VARCHAR(30) — 部门地址<br>);</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>— 添加数据<br>INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES (‘张三’, 20, ‘研发部’, ‘广州’);<br>INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES (‘李四’, 21, ‘研发部’, ‘广州’);<br>INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES (‘王五’, 20, ‘研发部’, ‘广州’);<br>INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES (‘老王’, 20, ‘销售部’, ‘深圳’);<br>INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES (‘大王’, 22, ‘销售部’, ‘深圳’);<br>INSERT INTO emp (NAME, age, dep_name, dep_location) VALUES (‘小王’, 18, ‘销售部’, ‘深圳’);</p>
<pre><code>    - 解决方案：分成 2 张表

        - -- 创建部门表(id,dep_name,dep_location)
</code></pre><p>— 一方，主表<br>CREATE TABLE department(<br>    id INT PRIMARY KEY AUTO_INCREMENT,<br>    dep_name VARCHAR(20),<br>    dep_location VARCHAR(20)<br>);</p>
<p>— 创建员工表(id,name,age,dep_id)<br>— 多方，从表<br>CREATE TABLE employee(<br>    id INT PRIMARY KEY AUTO_INCREMENT,<br>    NAME VARCHAR(20),<br>    age INT,<br>    dep_id INT — 外键对应主表的主键<br>);</p>
<p>— 添加 2 个部门<br>INSERT INTO department VALUES(NULL, ‘研发部’,’广州’),(NULL, ‘销售部’, ‘深圳’);<br>SELECT * FROM department;</p>
<p>— 添加员工,dep_id 表示员工所在的部门<br>INSERT INTO employee (NAME, age, dep_id) VALUES (‘张三’, 20, 1);<br>INSERT INTO employee (NAME, age, dep_id) VALUES (‘李四’, 21, 1);<br>INSERT INTO employee (NAME, age, dep_id) VALUES (‘王五’, 20, 1);<br>INSERT INTO employee (NAME, age, dep_id) VALUES (‘老王’, 20, 2);<br>INSERT INTO employee (NAME, age, dep_id) VALUES (‘大王’, 22, 2);<br>INSERT INTO employee (NAME, age, dep_id) VALUES (‘小王’, 18, 2);</p>
<p>SELECT <em> FROM employee;<br>SELECT </em> FROM department;</p>
<ul>
<li><p>外键约束 相关概念</p>
<ul>
<li><ul>
<li><p>外键约束：foreign key，让表与表产生关系，从而保证数据的正确性。</p>
<ul>
<li><ol>
<li><p>在创建表时，可以添加外键</p>
<ul>
<li><ul>
<li><p>语法：</p>
<ul>
<li>create table 表名(<br>….<br>外键列<br>constraint 外键名称 foreign key (外键列名称) references 主表名称(主表列名称)<br>);</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>删除外键</p>
<ul>
<li>ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>创建表之后，添加外键</p>
<ul>
<li><p>ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称); // 主键列、唯一约束列</p>
<ul>
<li>CREATE TABLE employee(<br>id INT PRIMARY KEY AUTO_INCREMENT,<br>NAME VARCHAR(20),<br>age INT,<br>dep_id INT, — 外键对应主表的主键<br>CONSTRAINT emp_dept_fk FOREIGN KEY (dep_id) REFERENCES department(id) — 外键约束<br>);</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>级联操作</p>
<ul>
<li><ol>
<li><p>添加级联操作</p>
<ul>
<li>语法：ALTER TABLE 表名 ADD CONSTRAINT 外键名称 </li>
<li>FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ON DELETE CASCADE  ;</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>分类：</p>
<ul>
<li><ol>
<li>级联更新：ON UPDATE CASCADE </li>
</ol>
</li>
<li><ol>
<li>级联删除：ON DELETE CASCADE </li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="09-多表操作"><a href="#09-多表操作" class="headerlink" title="09 多表操作"></a>09 多表操作</h3><ul>
<li><p>数据库的设计——1. 多表之间的关系</p>
<ul>
<li><ol>
<li><p>分类：</p>
<ul>
<li><ol>
<li><p>一对一(了解)：</p>
<ul>
<li><ul>
<li>如：人和身份证</li>
</ul>
</li>
<li><ul>
<li>分析：一个人只有一个身份证，一个身份证只能对应一个人。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>一对多(多对一)：</p>
<ul>
<li><ul>
<li>如：部门和员工</li>
</ul>
</li>
<li><ul>
<li>分析：一个部门有多个员工，一个员工只能对应一个部门。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>多对多：</p>
<ul>
<li><ul>
<li>如：学生和课程</li>
</ul>
</li>
<li><ul>
<li>分析：一个学生可以选择很多门课程，一个课程也可以被很多学生选择。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>实现关系：</p>
<ul>
<li><ol>
<li><p>一对多(多对一)：</p>
<ul>
<li><ul>
<li>如：部门和员工</li>
</ul>
</li>
<li><ul>
<li>实现方式：在多的一方建立外键，指向一的一方的主键。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
<li><p>多表关系_多对多关系实现</p>
<ul>
<li><ol>
<li><p>实现关系：</p>
<ul>
<li><ol>
<li><p>一对多(多对一)：</p>
<ul>
<li><ul>
<li>如：部门和员工</li>
</ul>
</li>
<li><ul>
<li>实现方式：在多的一方建立外键，指向一的一方的主键。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>多对多：</p>
<ul>
<li><ul>
<li>如：学生和课程</li>
</ul>
</li>
<li><ul>
<li>实现方式：多对多关系实现需要借助第三张中间表。中间表至少包含两个字段，这两个字段作为第三张表的外键，分别指向两张表的主键。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>一对一(了解)：</p>
<ul>
<li><ul>
<li>如：人和身份证</li>
</ul>
</li>
<li><ul>
<li>实现方式：一对一关系实现，可以在任意一方添加唯一外键指向另一方的主键。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
<li><p>多表关系_一对一关系实现</p>
<ul>
<li><ol>
<li><p>实现关系：</p>
<ul>
<li><ol>
<li><p>一对多(多对一)：</p>
<ul>
<li><ul>
<li>如：部门和员工</li>
</ul>
</li>
<li><ul>
<li>实现方式：在多的一方建立外键，指向一的一方的主键。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>多对多：</p>
<ul>
<li><ul>
<li>如：学生和课程</li>
</ul>
</li>
<li><ul>
<li>实现方式：多对多关系实现需要借助第三张中间表。中间表至少包含两个字段，这两个字段作为第三张表的外键，分别指向两张表的主键。</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>一对一(了解)：</p>
<ul>
<li><ul>
<li>如：人和身份证</li>
</ul>
</li>
<li><ul>
<li>实现方式：一对一关系实现，可以在任意一方添加唯一外键指向另一方的主键</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><p>— 创建旅游线路分类表 tab_category<br>— cid 旅游线路分类主键，自动增长<br>— cname 旅游线路分类名称非空，唯一，字符串 100<br>CREATE TABLE tab_category (<br>cid INT PRIMARY KEY AUTO_INCREMENT,<br>cname VARCHAR (100) NOT NULL UNIQUE<br>) ;</p>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>— 创建旅游线路表 tab_route<br>/<em><br>rid 旅游线路主键，自动增长<br>rname 旅游线路名称非空，唯一，字符串 100<br>price 价格<br>rdate 上架时间，日期类型<br>cid 外键，所属分类
</em>/<br>CREATE TABLE tab_route (<br>  rid INT PRIMARY KEY AUTO_INCREMENT,<br>  rname VARCHAR (100) NOT NULL UNIQUE,<br>  price DOUBLE,<br>  rdate DATE,<br>  cid INT,<br>  FOREIGN KEY (cid) REFERENCES tab_category (cid)<br>) ;</p>
<p>/<em>创建用户表 tab_user<br>uid 用户主键，自增长<br>username 用户名长度 100，唯一，非空<br>password 密码长度 30，非空<br>name 真实姓名长度 100<br>birthday 生日<br>sex 性别，定长字符串 1<br>telephone 手机号，字符串 11<br>email 邮箱，字符串长度 100
</em>/<br>CREATE TABLE tab_user (<br>  uid INT PRIMARY KEY AUTO_INCREMENT,<br>  username VARCHAR (100) UNIQUE NOT NULL,<br>  PASSWORD VARCHAR (30) NOT NULL,<br>  NAME VARCHAR (100),<br>  birthday DATE,<br>  sex CHAR(1) DEFAULT ‘男’,<br>  telephone VARCHAR (11),<br>  email VARCHAR (100)<br>) ;</p>
<p>/<em><br>创建收藏表 tab_favorite<br>rid 旅游线路 id，外键<br>date 收藏时间<br>uid 用户 id，外键<br>rid 和 uid 不能重复，设置复合主键，同一个用户不能收藏同一个线路两次
</em>/<br>CREATE TABLE tab_favorite (<br>  rid INT, — 线路id<br>  DATE DATETIME,<br>  uid INT,<br>  — 用户id<br>  — 创建复合主键<br>  PRIMARY KEY (rid, uid),<br>  — 联合主键<br>  FOREIGN KEY (rid) REFERENCES tab_route (rid),<br>  FOREIGN KEY (uid) REFERENCES tab_user (uid)</p>
<h3 id="10-三大范式"><a href="#10-三大范式" class="headerlink" title="10 三大范式"></a>10 三大范式</h3><ul>
<li><ol>
<li><p>数据库设计的范式</p>
<ul>
<li><ul>
<li><p>概念：设计数据库时，需要遵循的一些规范。要遵循后边的范式要求，必须先遵循前边的所有范式要求。</p>
<ul>
<li>设计关系数据库时，遵从不同的规范要求，设计出合理的关系型数据库，这些不同的规范要求被称为不同的范式，各种范式呈递次规范，越高的范式数据库冗余越小。</li>
<li><p>目前关系数据库有六种范式</p>
<ul>
<li>第一范式（1NF）</li>
<li>第二范式（2NF）</li>
<li>第三范式（3NF）</li>
<li>巴斯-科德范式（BCNF）</li>
<li>第四范式(4NF）</li>
<li>第五范式（5NF，又称完美范式）</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>分类：</p>
<ul>
<li><ol>
<li>第一范式（1NF）：每一列都是不可分割的原子数据项。</li>
</ol>
</li>
<li><ol>
<li>第二范式（2NF）：在1NF的基础上，非码属性必须完全依赖于码（在1NF基础上消除非主属性对主码的部分函数依赖）。</li>
</ol>
</li>
<li><ol>
<li>第三范式（3NF）：在2NF基础上，任何非主属性不依赖于其它非主属性（在2NF基础上消除传递依赖）。</li>
</ol>
</li>
<li><ul>
<li><p>几个概念：</p>
<ul>
<li><ol>
<li><p>函数依赖：A—&gt;B,如果通过A属性(属性组)的值，可以确定唯一B属性的值，则称B依赖于A。</p>
<ul>
<li>例如：学号—&gt;姓名。  （学号，课程名称） —&gt; 分数</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>完全函数依赖：A—&gt;B， 如果A是一个属性组，则B属性值的确定需要依赖于A属性组中所有的属性值。</p>
<ul>
<li>例如：（学号，课程名称） —&gt; 分数</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>部分函数依赖：A—&gt;B， 如果A是一个属性组，则B属性值的确定只需要依赖于A属性组中某一些值即可。</p>
<ul>
<li>例如：（学号，课程名称） —&gt; 姓名</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>传递函数依赖：A—&gt;B, B—&gt;C。如果通过A属性(属性组)的值，可以确定唯一B属性的值，在通过B属性（属性组）的值可以确定唯一C属性的值，则称C传递函数依赖于A。</p>
<ul>
<li>例如：学号—&gt;系名，系名—&gt;系主任</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>码：如果在一张表中，一个属性或属性组，被其他所有属性所完全依赖，则称这个属性(属性组)为该表的码。</p>
<ul>
<li>例如：该表中码为：（学号，课程名称）</li>
<li><ul>
<li>主属性：码属性组中的所有属性</li>
</ul>
</li>
<li><ul>
<li>非主属性：除过码属性组的属性</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
<h3 id="11-数据库的备份和还原"><a href="#11-数据库的备份和还原" class="headerlink" title="11 数据库的备份和还原"></a>11 数据库的备份和还原</h3><ul>
<li><ol>
<li><p>命令行：</p>
<ul>
<li><ul>
<li><p>语法：</p>
<ul>
<li><ul>
<li>备份：mysqldump -u用户名 -p密码 数据库名称 &gt; 保存的路径</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li><p>还原：</p>
<ul>
<li><ol>
<li>登录数据库</li>
</ol>
</li>
<li><ol>
<li>创建数据库</li>
</ol>
</li>
<li><ol>
<li>使用数据库</li>
</ol>
</li>
<li><ol>
<li>执行文件。source 文件路径</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li>图形化工具</li>
</ol>
</li>
</ul>
<h3 id="12-多表查询"><a href="#12-多表查询" class="headerlink" title="12 多表查询"></a>12 多表查询</h3><ul>
<li><p>多表查询_概述</p>
<ul>
<li><ul>
<li><p>查询语法：</p>
<ul>
<li>select<br>列名列表<br>from<br>表名列表<br>where….</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li><p>准备sql</p>
<ul>
<li><h1 id="创建部门表"><a href="#创建部门表" class="headerlink" title="创建部门表"></a>创建部门表</h1><ul>
<li>CREATE TABLE dept(<br>id INT PRIMARY KEY AUTO_INCREMENT,<br>NAME VARCHAR(20)<br>);<br>INSERT INTO dept (NAME) VALUES (‘开发部’),(‘市场部’),(‘财务部’);</li>
</ul>
</li>
<li><h1 id="创建员工表"><a href="#创建员工表" class="headerlink" title="创建员工表"></a>创建员工表</h1><ul>
<li>CREATE TABLE emp (<br>id INT PRIMARY KEY AUTO_INCREMENT,<br>NAME VARCHAR(10),<br>gender CHAR(1), — 性别<br>salary DOUBLE, — 工资<br>join_date DATE, — 入职日期<br>dept_id INT,<br>FOREIGN KEY (dept_id) REFERENCES dept(id) — 外键，关联部门表(部门表的主键)<br>);</li>
</ul>
</li>
<li><h1 id="插入数据"><a href="#插入数据" class="headerlink" title="插入数据"></a>插入数据</h1><ul>
<li>INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘孙悟空’,’男’,7200,’2013-02-24’,1);<br>INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘猪八戒’,’男’,3600,’2010-12-02’,2);<br>INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘唐僧’,’男’,9000,’2008-08-08’,2);<br>INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘白骨精’,’女’,5000,’2015-10-07’,3);<br>INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES(‘蜘蛛精’,’女’,4500,’2011-03-14’,1);</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li><p>笛卡尔积：</p>
<ul>
<li><ul>
<li>有两个集合A,B，取这两个集合的所有组成情况。</li>
</ul>
</li>
<li><ul>
<li>要完成多表查询，需要消除无用的数据。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li><p>多表查询的分类：</p>
<ul>
<li><ol>
<li><p>内连接查询</p>
<ul>
<li><ol>
<li><p>隐式内连接：使用where条件消除无用数据。</p>
<ul>
<li><ul>
<li>例子：</li>
</ul>
<ul>
<li><p>— 查询所有员工信息和对应的部门信息</p>
<ul>
<li>SELECT * FROM emp, dept WHERE emp.<code>dept_id</code> = dept.<code>id</code>;</li>
</ul>
</li>
<li><p>— 查询员工表的名称，性别。部门表的名称</p>
<ul>
<li>SELECT emp.name, emp.gender, dept.name FROM emp, dept WHERE emp.<code>dept_id</code> = dept.<code>id</code>;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>显式内连接：</p>
<ul>
<li><ul>
<li>语法： select 字段列表 from 表名1 [inner] join 表名2 on 条件</li>
</ul>
<ul>
<li><ul>
<li><p>例如：</p>
<ul>
<li><ul>
<li>SELECT * FROM emp INNER JOIN dept ON emp.<code>dept_id</code> = dept.<code>id</code>;    </li>
</ul>
</li>
<li><ul>
<li>SELECT * FROM emp JOIN dept ON emp.<code>dept_id</code> = dept.<code>id</code>;    </li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>内连接查询（注意事项）：</p>
<ul>
<li><ol>
<li>从哪些表中查询数据</li>
</ol>
</li>
<li><ol>
<li>条件是什么</li>
</ol>
</li>
<li><ol>
<li>查询哪些字段</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>外连接查询</p>
<ul>
<li><ol>
<li><p>左外连接：</p>
<ul>
<li><ul>
<li>语法：select 字段列表 from 表1 left [outer] join 表2 on 条件；</li>
</ul>
</li>
<li><ul>
<li>查询的是左表所有数据以及其交集部分。</li>
</ul>
</li>
<li><ul>
<li>例子：</li>
</ul>
<ul>
<li><p>— 查询所有员工信息，如果员工有部门，则查询部门名称，没有部门，则不显示部门名称</p>
<ul>
<li>SELECT t1.*,t2.<code>name</code> FROM emp t1 LEFT JOIN dept t2 ON t1.<code>dept_id</code> = t2.<code>id</code>;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>右外连接：</p>
<ul>
<li><ul>
<li>语法：select 字段列表 from 表1 right [outer] join 表2 on 条件；</li>
</ul>
</li>
<li><ul>
<li>查询的是右表所有数据以及其交集部分。</li>
</ul>
</li>
<li><ul>
<li>例子：</li>
</ul>
<ul>
<li>SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.<code>dept_id</code> = t2.<code>id</code>;</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>子查询</p>
<ul>
<li><ul>
<li>概念：查询中嵌套查询，称嵌套查询为子查询。</li>
</ul>
</li>
<li><p>— 查询工资最高的员工信息</p>
<ul>
<li>SELECT MAX(salary) FROM emp;</li>
</ul>
</li>
<li><p>— 2 查询员工信息，并且工资等于9000的</p>
<ul>
<li>SELECT * FROM emp WHERE emp.<code>salary</code> = 9000;</li>
</ul>
</li>
<li><p>— 一条sql就完成这个操作。子查询</p>
<ul>
<li>SELECT * FROM emp WHERE emp.<code>salary</code> = (SELECT MAX(salary) FROM emp);</li>
</ul>
</li>
<li><ul>
<li><p>子查询不同情况</p>
<ul>
<li><ol>
<li><p>子查询的结果是单行单列的：</p>
<ul>
<li><ul>
<li>子查询可以作为条件，使用运算符去判断。 运算符： &gt; &gt;= &lt; &lt;= =</li>
</ul>
</li>
<li><p>— 查询员工工资小于平均工资的人</p>
<ul>
<li>SELECT * FROM emp WHERE emp.salary &lt; (SELECT AVG(salary) FROM emp);</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><p>2.子查询的结果是多行单列的：</p>
<ul>
<li><ul>
<li>子查询可以作为条件，使用运算符in来判断</li>
</ul>
</li>
<li><p>— 查询’财务部’和’市场部’所有的员工信息</p>
<ul>
<li>SELECT id FROM dept WHERE NAME = ‘财务部’ OR NAME = ‘市场部’;</li>
<li>SELECT * FROM emp WHERE dept_id = 3 OR dept_id = 2;</li>
</ul>
</li>
<li><p>— 子查询</p>
<ul>
<li>SELECT * FROM emp WHERE dept_id IN (SELECT id FROM dept WHERE NAME = ‘财务部’ OR NAME = ‘市场部’);</li>
</ul>
</li>
</ul>
</li>
<li><ol>
<li><p>子查询的结果是多行多列的：</p>
<ul>
<li><ul>
<li>子查询可以作为一张虚拟表参与查询</li>
</ul>
</li>
<li><p>— 查询员工入职日期是2011-11-11日之后的员工信息和部门信息</p>
<ul>
<li><p>— 子查询</p>
<ul>
<li>SELECT <em> FROM dept t1 ,(SELECT </em> FROM emp WHERE emp.<code>join_date</code> &gt; ‘2011-11-11’) t2 WHERE t1.id = t2.dept_id;</li>
</ul>
</li>
<li><p>— 普通内连接</p>
<ul>
<li>SELECT * FROM emp t1,dept t2 WHERE t1.<code>dept_id</code> = t2.<code>id</code> AND t1.<code>join_date</code> &gt;  ‘2011-11-11’;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<h3 id="14-多表查询练习"><a href="#14-多表查询练习" class="headerlink" title="14 多表查询练习"></a>14 多表查询练习</h3><ul>
<li><p>创建 数据库db3、创建 4个 数据表</p>
<ul>
<li><p>代码</p>
<p>— 部门表<br>CREATE TABLE dept (<br>  id INT PRIMARY KEY PRIMARY KEY, — 部门id<br>  dname VARCHAR(50), — 部门名称<br>  loc VARCHAR(50) — 部门所在地<br>);</p>
<p>— 添加4个部门<br>INSERT INTO dept(id,dname,loc) VALUES<br>(10,’教研部’,’北京’),<br>(20,’学工部’,’上海’),<br>(30,’销售部’,’广州’),<br>(40,’财务部’,’深圳’);</p>
</li>
</ul>
</li>
</ul>
<pre><code>  -- 职务表，职务名称，职务描述
  CREATE TABLE job (
    id INT PRIMARY KEY,
    jname VARCHAR(20),
    description VARCHAR(50)
  );

  -- 添加4个职务
  INSERT INTO job (id, jname, description) VALUES
  (1, &#39;董事长&#39;, &#39;管理整个公司，接单&#39;),
  (2, &#39;经理&#39;, &#39;管理部门员工&#39;),
  (3, &#39;销售员&#39;, &#39;向客人推销产品&#39;),
  (4, &#39;文员&#39;, &#39;使用办公软件&#39;);



  -- 员工表
  CREATE TABLE emp (
    id INT PRIMARY KEY, -- 员工id
    ename VARCHAR(50), -- 员工姓名
    job_id INT, -- 职务id
    mgr INT , -- 上级领导
    joindate DATE, -- 入职日期
    salary DECIMAL(7,2), -- 工资
    bonus DECIMAL(7,2), -- 奖金
    dept_id INT, -- 所在部门编号
    CONSTRAINT emp_jobid_ref_job_id_fk FOREIGN KEY (job_id) REFERENCES job (id),
    CONSTRAINT emp_deptid_ref_dept_id_fk FOREIGN KEY (dept_id) REFERENCES dept (id)
  );

  -- 添加员工
  INSERT INTO emp(id,ename,job_id,mgr,joindate,salary,bonus,dept_id) VALUES 
  (1001,&#39;孙悟空&#39;,4,1004,&#39;2000-12-17&#39;,&#39;8000.00&#39;,NULL,20),
  (1002,&#39;卢俊义&#39;,3,1006,&#39;2001-02-20&#39;,&#39;16000.00&#39;,&#39;3000.00&#39;,30),
  (1003,&#39;林冲&#39;,3,1006,&#39;2001-02-22&#39;,&#39;12500.00&#39;,&#39;5000.00&#39;,30),
  (1004,&#39;唐僧&#39;,2,1009,&#39;2001-04-02&#39;,&#39;29750.00&#39;,NULL,20),
  (1005,&#39;李逵&#39;,4,1006,&#39;2001-09-28&#39;,&#39;12500.00&#39;,&#39;14000.00&#39;,30),
  (1006,&#39;宋江&#39;,2,1009,&#39;2001-05-01&#39;,&#39;28500.00&#39;,NULL,30),
  (1007,&#39;刘备&#39;,2,1009,&#39;2001-09-01&#39;,&#39;24500.00&#39;,NULL,10),
  (1008,&#39;猪八戒&#39;,4,1004,&#39;2007-04-19&#39;,&#39;30000.00&#39;,NULL,20),
  (1009,&#39;罗贯中&#39;,1,NULL,&#39;2001-11-17&#39;,&#39;50000.00&#39;,NULL,10),
  (1010,&#39;吴用&#39;,3,1006,&#39;2001-09-08&#39;,&#39;15000.00&#39;,&#39;0.00&#39;,30),
  (1011,&#39;沙僧&#39;,4,1004,&#39;2007-05-23&#39;,&#39;11000.00&#39;,NULL,20),
  (1012,&#39;李逵&#39;,4,1006,&#39;2001-12-03&#39;,&#39;9500.00&#39;,NULL,30),
  (1013,&#39;小白龙&#39;,4,1004,&#39;2001-12-03&#39;,&#39;30000.00&#39;,NULL,20),
  (1014,&#39;关羽&#39;,4,1007,&#39;2002-01-23&#39;,&#39;13000.00&#39;,NULL,10);



  -- 工资等级表
  CREATE TABLE salarygrade (
    grade INT PRIMARY KEY,  -- 级别
    losalary INT, -- 最低工资
    hisalary INT -- 最高工资
  );

  -- 添加5个工资等级
  INSERT INTO salarygrade(grade,losalary,hisalary) VALUES 
  (1,7000,12000),
  (2,12010,14000),
  (3,14010,20000),
  (4,20010,30000),
  (5,30010,99990);

- 需求：

    - -- 1.查询所有员工信息。查询员工编号，员工姓名，工资，职务名称，职务描述
    - -- 2.查询员工编号，员工姓名，工资，职务名称，职务描述，部门名称，部门位置
    - -- 3.查询员工姓名，工资，工资等级
    - -- 4.查询员工姓名，工资，职务名称，职务描述，部门名称，部门位置，工资等级
    - -- 5.查询出部门编号、部门名称、部门位置、部门人数
    - -- 6.查询所有员工的姓名及其直接上级的姓名,没有领导的员工也需要查
    - -- 7.查询所有员工信息：查询员工编号，员工姓名，工资，职务名称，职务描述。

- 分析：

    - 员工编号，员工姓名，工资，需要查询emp表  职务名称，职务描述 需要查询job表
</code></pre><p>查询条件 emp.job_id = job.id<br>SELECT<br>    t1.<code>id</code>, — 员工编号<br>    t1.<code>ename</code>, — 员工姓名<br>    t1.<code>salary</code>,— 工资<br>    t2.<code>jname</code>, — 职务名称<br>    t2.<code>description</code> — 职务描述<br>FROM<br>    emp t1, job t2<br>WHERE<br>    t1.<code>job_id</code> = t2.<code>id</code>;</p>
<pre><code>- 需求2

    - -- 2.查询员工编号、员工姓名、工资、职务名称、职务描述、部门名称、部门位置。

- 分析：

    - 员工编号，员工姓名，工资 emp 职务名称，职务描述 job 部门名称，部门位置 dept
</code></pre><p>条件： emp.job_id = job.id and emp.dept_id = dept.id<br>SELECT<br>    t1.<code>id</code>, — 员工编号<br>    t1.<code>ename</code>, — 员工姓名<br>    t1.<code>salary</code>,— 工资<br>    t2.<code>jname</code>, — 职务名称<br>    t2.<code>description</code>, — 职务描述<br>    t3.<code>dname</code>, — 部门名称<br>    t3.<code>loc</code> — 部门位置<br>FROM<br>    emp t1, job t2,dept t3<br>WHERE<br>    t1.<code>job_id</code> = t2.<code>id</code> AND t1.<code>dept_id</code> = t3.<code>id</code>;</p>
<pre><code>- 需求3
- -- 3.查询员工姓名、工资、工资等级。
- 分析：

    - 员工姓名，工资 emp  工资等级 salarygrade
</code></pre><p>条件 emp.salary &gt;= salarygrade.losalary and emp.salary &lt;= salarygrade.hisalary / emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary<br>SELECT<br>    t1.ename ,<br>    t1.<code>salary</code>,<br>    t2.*<br>FROM emp t1, salarygrade t2<br>WHERE t1.<code>salary</code> BETWEEN t2.<code>losalary</code> AND t2.<code>hisalary</code>;</p>
<pre><code>- 需求4
- -- 4.查询员工姓名、工资、职务名称、职务描述、部门名称、部门位置、工资等级。
- 分析：

    - 员工姓名，工资 emp ， 职务名称，职务描述 job 部门名称，部门位置，dept 工资等级 salarygrade
</code></pre><p>条件： emp.job_id = job.id and emp.dept_id = dept.id and emp.salary BETWEEN salarygrade.losalary and salarygrade.hisalary<br>SELECT<br>    t1.<code>ename</code>,<br>    t1.<code>salary</code>,<br>    t2.<code>jname</code>,<br>    t2.<code>description</code>,<br>    t3.<code>dname</code>,<br>    t3.<code>loc</code>,<br>    t4.<code>grade</code><br>FROM<br>    emp t1,job t2,dept t3,salarygrade t4<br>WHERE<br>    t1.<code>job_id</code> = t2.<code>id</code><br>    AND t1.<code>dept_id</code> = t3.<code>id</code><br>    AND t1.<code>salary</code> BETWEEN t4.<code>losalary</code> AND t4.<code>hisalary</code>;</p>
<pre><code>- 需求5
- -- 5.查询出部门编号、部门名称、部门位置、部门人数。
- 分析：
- 部门编号、部门名称、部门位置 dept 表。 部门人数 emp表
- 使用分组查询。按照emp.dept_id完成分组，查询count(id)
- 使用子查询将第2步的查询结果和dept表进行关联查询

    - SELECT 
t1.`id`,
t1.`dname`,
t1.`loc`,
t2.total
</code></pre><p>FROM<br>    dept t1,<br>    (SELECT<br>        dept_id,COUNT(id) total — 别名total<br>    FROM<br>        emp<br>    GROUP BY dept_id) t2<br>WHERE t1.<code>id</code> = t2.dept_id;</p>
<pre><code>- 需求6
- -- 6.查询所有员工的姓名及其直接上级的姓名，没有领导的员工 也需要查询。
- 分析：

    - 姓名 emp， 直接上级的姓名 emp    * emp表的id 和 mgr 是自关联
</code></pre><p>条件 emp.id = emp.mgr<br>查询左表的所有数据，和 交集数据    * 使用左外连接查询<br>SELECT<br>    t1.ename,<br>    t1.mgr,<br>    t2.<code>id</code>,<br>    t2.ename<br>FROM emp t1, emp t2<br>WHERE t1.mgr = t2.<code>id</code>;</p>
<p>SELECT<br>    t1.ename,<br>    t1.mgr,<br>    t2.<code>id</code>,<br>    t2.<code>ename</code><br>FROM emp t1<br>LEFT JOIN emp t2<br>ON t1.<code>mgr</code> = t2.<code>id</code>;</p>
<h3 id="15-事务"><a href="#15-事务" class="headerlink" title="15 事务"></a>15 事务</h3><ul>
<li><ol>
<li><p>事务的基本介绍</p>
<ul>
<li><ol>
<li><p>概念：</p>
<ul>
<li>*如果一个包含多个步骤的业务操作，被事务管理，那么这些操作要么同时成功，要么同时失败。        </li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>操作：</p>
<ul>
<li><ol>
<li>开启事务： start transaction;</li>
</ol>
</li>
<li><ol>
<li>回滚：rollback;</li>
</ol>
</li>
<li><ol>
<li>提交：commit;</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>例子：</p>
<ul>
<li>CREATE TABLE account (<br>id INT PRIMARY KEY AUTO_INCREMENT,<br>NAME VARCHAR(10),<br>balance DOUBLE<br>);<br>— 添加数据<br>INSERT INTO account (NAME, balance) VALUES (‘zhangsan’, 1000), (‘lisi’, 1000);<br>SELECT * FROM account;<br>UPDATE account SET balance = 1000;<br>— 张三给李四转账 500 元<br>— 0. 开启事务<br>START TRANSACTION;<br>— 1. 张三账户 -500<br>UPDATE account SET balance = balance - 500 WHERE NAME = ‘zhangsan’;<br>— 2. 李四账户 +500<br>— 出错了…<br>UPDATE account SET balance = balance + 500 WHERE NAME = ‘lisi’;<br>— 发现执行没有问题，提交事务<br>COMMIT;<br>— 发现出问题了，回滚事务<br>ROLLBACK;</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>MySQL数据库中事务默认自动提交</p>
<ul>
<li><ul>
<li>事务提交的两种方式：</li>
</ul>
<ul>
<li><ul>
<li><p>自动提交：</p>
<ul>
<li><ul>
<li>mysql就是自动提交的</li>
</ul>
</li>
<li><ul>
<li>一条DML(增删改)语句会自动提交一次事务。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li><p>手动提交：</p>
<ul>
<li><ul>
<li>Oracle 数据库默认是手动提交事务</li>
</ul>
</li>
<li><ul>
<li>需要先开启事务，再提交</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li>修改事务的默认提交方式：</li>
</ul>
<ul>
<li><ul>
<li>查看事务的默认提交方式：SELECT @@autocommit; — 1 代表自动提交  0 代表手动提交</li>
</ul>
</li>
<li><ul>
<li>修改默认提交方式： set @@autocommit = 0;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>事务的四大特征：</p>
<ul>
<li><ol>
<li>原子性：是不可分割的最小操作单位，要么同时成功，要么同时失败。</li>
</ol>
</li>
<li><ol>
<li>持久性：当事务提交或回滚后，数据库会持久化的保存数据。</li>
</ol>
</li>
<li><ol>
<li>隔离性：多个事务之间。相互独立。</li>
</ol>
</li>
<li><ol>
<li>一致性：事务操作前后，数据总量不变</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>事务的隔离级别</p>
<ul>
<li><ul>
<li>概念：多个事务之间隔离的，相互独立的。但是如果多个事务操作同一批数据，则会引发一些问题，设置不同的隔离级别就可以解决这些问题。</li>
</ul>
</li>
<li><ul>
<li><p>存在问题：</p>
<ul>
<li><ol>
<li>脏读：一个事务，读取到另一个事务中没有提交的数据</li>
</ol>
</li>
<li><ol>
<li>幻读：一个事务操作(DML)数据表中所有记录，另一个事务添加了一条数据，则第一个事务查询不到自己的修改。</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li><p>隔离级别：</p>
<ul>
<li><ol>
<li><p>read uncommitted：读未提交</p>
<ul>
<li><ul>
<li>产生的问题：脏读、不可重复读、幻读</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>read committed：读已提交 （Oracle）</p>
<ul>
<li><ul>
<li>产生的问题：不可重复读、幻读</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>repeatable read：可重复读 （MySQL默认）</p>
<ul>
<li><ul>
<li>产生的问题：幻读</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>serializable：串行化</p>
<ul>
<li><ul>
<li>可以解决所有的问题</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ul>
<li>注意：隔离级别从小到大，安全性越来越高，但是效率越来越低。</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li><p>数据库查询隔离级别：</p>
<ul>
<li><ul>
<li>select @@tx_isolation;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li><p>数据库设置隔离级别：</p>
<ul>
<li><ul>
<li>set global transaction isolation level 级别字符串;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li><p>演示：</p>
<ul>
<li>set global transaction isolation level read uncommitted;<br>start transaction;<br>— 转账操作<br>update account set balance = balance - 500 where id = 1;<br>update account set balance = balance + 500 where id = 2;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
</ul>
<h3 id="16-用户管理和权限管理"><a href="#16-用户管理和权限管理" class="headerlink" title="16 用户管理和权限管理"></a>16 用户管理和权限管理</h3><ul>
<li><ul>
<li><p>SQL分类：</p>
<ul>
<li><ol>
<li>DDL：操作数据库和表</li>
</ol>
</li>
<li><ol>
<li>DML：增删改表中数据</li>
</ol>
</li>
<li><ol>
<li>DQL：查询表中数据</li>
</ol>
</li>
<li><ol>
<li>DCL：管理用户，授权</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
<li><ul>
<li>DBA：数据库管理员</li>
</ul>
</li>
<li><ul>
<li>DCL：管理用户，授权</li>
</ul>
</li>
<li><ol>
<li><p>管理用户</p>
<ul>
<li><ol>
<li><p>添加用户：</p>
<ul>
<li><ul>
<li>语法：CREATE USER ‘用户名’@’主机名’ IDENTIFIED BY ‘密码’;</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>删除用户：</p>
<ul>
<li><ul>
<li>语法：DROP USER ‘用户名’@’主机名’;</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>修改用户密码</p>
<ul>
<li>UPDATE USER SET PASSWORD = PASSWORD(‘新密码’) WHERE USER = ‘用户名’;</li>
<li>UPDATE USER SET PASSWORD = PASSWORD(‘abc’) WHERE USER = ‘lisi’;</li>
<li>SET PASSWORD FOR ‘用户名’@’主机名’ = PASSWORD(‘新密码’);</li>
<li>SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘123’);</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>查询用户：</p>
<ul>
<li>— 1. 切换到mysql数据库</li>
<li>USE myql;</li>
<li>— 2. 查询user表</li>
<li>SELECT * FROM USER;</li>
<li><ul>
<li>通配符： % 表示可以在任意主机使用用户登录数据库</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ul>
<li><p>mysql中忘记了root用户的密码？</p>
<ul>
<li><ol>
<li>cmd — &gt; net stop mysql 停止mysql服务(需要管理员运行该cmd)</li>
</ol>
</li>
<li><ol>
<li>使用无验证方式启动mysql服务： mysqld —skip-grant-tables</li>
</ol>
</li>
<li><ol>
<li>打开新的cmd窗口,直接输入mysql命令，敲回车。就可以登录成功</li>
</ol>
</li>
<li><ol>
<li>use mysql;</li>
</ol>
</li>
<li><ol>
<li>update user set password = password(‘你的新密码’) where user = ‘root’;</li>
</ol>
</li>
<li><ol>
<li>关闭两个窗口</li>
</ol>
</li>
<li><ol>
<li>打开任务管理器，手动结束mysqld.exe 的进程</li>
</ol>
</li>
<li><ol>
<li>启动mysql服务</li>
</ol>
</li>
<li><ol>
<li>使用新密码登录。</li>
</ol>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>权限管理：</p>
<ul>
<li><ol>
<li><p>查询权限：</p>
<ul>
<li>SHOW GRANTS FOR ‘用户名’@’主机名’;</li>
<li>SHOW GRANTS FOR ‘lisi’@’%’;</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>授予权限：</p>
<ul>
<li>grant 权限列表 on 数据库名.表名 to ‘用户名’@’主机名’;</li>
<li>— 给张三用户授予所有权限，在任意数据库任意表上</li>
<li>GRANT ALL ON <em>.</em> TO ‘zhangsan’@’localhost’;</li>
</ul>
</li>
</ol>
</li>
<li><ol>
<li><p>撤销权限：</p>
<ul>
<li>— 撤销权限：</li>
<li>revoke 权限列表 on 数据库名.表名 from ‘用户名’@’主机名’;</li>
<li>REVOKE UPDATE ON db3.<code>account</code> FROM ‘lisi’@’%’;</li>
</ul>
</li>
</ol>
</li>
</ul>
</li>
</ol>
</li>
</ul>

      
    </div>
    <footer class="article-footer">
      <a data-url="https://goofyer.gitee.io/notes-on-computer-expertise/2021/12/20/Java/%E7%AC%AC%E5%8D%81%E4%B8%89%E7%AB%A0MySQL/" data-id="cl403sxrc001sf8vuh8kb879j" data-title="" class="article-share-link">Share</a>
      
      
      
    </footer>
  </div>
  
    
<nav id="article-nav">
  
    <a href="/notes-on-computer-expertise/2021/12/20/Java/%E7%AC%AC%E5%8D%81%E5%9B%9B%E7%AB%A0JDBC/" id="article-nav-newer" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Newer</strong>
      <div class="article-nav-title">
        
          (no title)
        
      </div>
    </a>
  
  
    <a href="/notes-on-computer-expertise/2021/12/20/Java/%E7%AC%AC%E5%8D%81%E4%BA%8C%E7%AB%A0%20%E5%8F%8D%E5%B0%84/" id="article-nav-older" class="article-nav-link-wrap">
      <strong class="article-nav-caption">Older</strong>
      <div class="article-nav-title"></div>
    </a>
  
</nav>

  
</article>


</section>
        
          <aside id="sidebar">
  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Categories</h3>
    <div class="widget">
      <ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/C-%E5%B7%A5%E5%85%B7/">C#工具</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/C-%E5%B7%A5%E5%85%B7/">C++工具</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/Mysql/">Mysql</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/blender/">blender</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/linux/">linux</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/manim/">manim</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/spring/">spring</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/vba%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C/">vba基础操作</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E5%88%9B%E9%80%A0%E6%A8%A1%E5%BC%8F/">创造模式</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/">操作系统</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/">操作系统基础知识</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91/">操作系统开发</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E5%AD%A6/">数学</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/">数据结构</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/">数据结构基础知识</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%A8%A1%E6%9D%BF/">模板</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/">深度学习</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%8B%B1%E8%AF%AD/">英语</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%99%9A%E5%B9%BB4/">虚幻4</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/">计算机组成原理</a></li><li class="category-list-item"><a class="category-list-link" href="/notes-on-computer-expertise/categories/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/">计算机网络</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list" itemprop="keywords"><li class="tag-list-item"><a class="tag-list-link" href="/notes-on-computer-expertise/tags/C/" rel="tag">C++</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tag Cloud</h3>
    <div class="widget tagcloud">
      <a href="/notes-on-computer-expertise/tags/C/" style="font-size: 10px;">C++</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/05/">May 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/03/">March 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/02/">February 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2022/01/">January 2022</a></li><li class="archive-list-item"><a class="archive-list-link" href="/notes-on-computer-expertise/archives/2021/12/">December 2021</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/31/vue/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6%E9%AA%8C%E8%AF%81%E7%A0%81%E6%97%A0%E6%B3%95%E6%98%BE%E7%A4%BA/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/26/%E6%95%B0%E6%8D%AE%E5%BA%93/navicat%E5%AE%89%E8%A3%85/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/25/%E8%99%9A%E5%B9%BB4%E5%BC%95%E6%93%8E%E5%BC%80%E5%8F%91/%E8%99%9A%E5%B9%BB%E5%9B%9B%20mod%E5%88%B6%E4%BD%9C/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/23/python/python%E6%89%B9%E9%87%8F%E7%94%9F%E6%88%90%E6%95%B0%E6%8D%AE/">(no title)</a>
          </li>
        
          <li>
            <a href="/notes-on-computer-expertise/2022/05/23/vba%E5%9F%BA%E7%A1%80%E6%93%8D%E4%BD%9C%E7%AC%94%E8%AE%B0/EXCEL%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/">(no title)</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
  
  <div class="outer">
    <div id="footer-info" class="inner">
      
      &copy; 2022 John Doe<br>
      Powered by <a href="https://hexo.io/" target="_blank">Hexo</a>
    </div>
  </div>
</footer>

    </div>
    <nav id="mobile-nav">
  
    <a href="/notes-on-computer-expertise/" class="mobile-nav-link">Home</a>
  
    <a href="/notes-on-computer-expertise/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    


<script src="/notes-on-computer-expertise/js/jquery-3.4.1.min.js"></script>



  
<script src="/notes-on-computer-expertise/fancybox/jquery.fancybox.min.js"></script>




<script src="/notes-on-computer-expertise/js/script.js"></script>





  </div>
<script type="text/x-mathjax-config">
    MathJax.Hub.Config({
        tex2jax: {
            inlineMath: [ ["$","$"], ["\\(","\\)"] ],
            skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code'],
            processEscapes: true
        }
    });
    MathJax.Hub.Queue(function() {
        var all = MathJax.Hub.getAllJax();
        for (var i = 0; i < all.length; ++i)
            all[i].SourceElement().parentNode.className += ' has-jax';
    });
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"></script>
</body>
</html>